// encoder.c
#include "encoder.h"
#include "Arduino.h"

// 4倍频查表
static const int8_t quad_table[16] = {
     0,  +1,  -1,   0,
    -1,   0,   0,  +1,
    +1,   0,   0,  -1,
     0,  -1,  +1,   0
};

// 支持最多两个编码器
static Encoder *g_encoders[2] = {NULL, NULL};

// 专用 ISR（每个编码器一个）
static void encoder_isr_0(void) { if (g_encoders[0]) update_encoder(g_encoders[0]); }
static void encoder_isr_1(void) { if (g_encoders[1]) update_encoder(g_encoders[1]); }

// 更新函数（内部使用）
static void update_encoder(Encoder *enc) {
    uint8_t a = digitalRead(enc->pin_a);
    uint8_t b = digitalRead(enc->pin_b);
    uint8_t state = (a << 1) | b;
    uint8_t prev = enc->last_ab;
    uint8_t trans = (prev << 2) | state;
    enc->count += quad_table[trans];
    enc->last_ab = state;
	if(enc->callback) { //调用回调
		enc->callback(enc->callback_context);
	}
}

// 初始化编码器
void encoder_init(Encoder *enc, GPIO_PinName pin_a, GPIO_PinName pin_b)
{
    // 查找空槽
    int idx = -1;
    void (*isr_func)(void) = NULL;

    if (g_encoders[0] == NULL) {
        idx = 0;
        isr_func = encoder_isr_0;
    } else if (g_encoders[1] == NULL) {
        idx = 1;
        isr_func = encoder_isr_1;
    } else {
        while(1); // 错误：超出支持数量
    }

    // 初始化结构体
    enc->count = 0;
    enc->last_ab = (digitalRead(pin_a) << 1) | digitalRead(pin_b);
    enc->pin_a = pin_a;
    enc->pin_b = pin_b;
	enc->callback = NULL;
	enc->callback_context = NULL;

    // 保存到全局数组
    g_encoders[idx] = enc;

    // 配置引脚
    pinMode(pin_a, INPUT);
    pinMode(pin_b, INPUT);

    // 注册中断
    attachInterrupt(pin_a, isr_func, CHANGE);
    attachInterrupt(pin_b, isr_func, CHANGE);
}

void encoder_register_callback(Encoder *enc, void (*callback)(void *ctx), void *context)
{
	enc->callback = callback;
	enc->callback_context = context;
}

int32_t encoder_get_count(Encoder *enc)
{
    return enc->count;
}

void encoder_reset(Encoder *enc)
{
    enc->count = 0;
}
